#include <iostream>
#include <cmath>
#include "Recta.h"


using namespace std;

TFloat distancia(Punto a, Punto b){

    double x1=a.get_x().dbl();
    double x2=b.get_x().dbl();
    
    double y1= a.get_y().dbl();
    double y2= b.get_y().dbl();
    
    double z1= a.get_z().dbl();
    double z2= b.get_z().dbl();

    return TFloat((sqrt(pow((x1-x2),2)+pow((y1-y2),2)+pow((z1-z2),2))),52);

}

TFloat calcularProximidad( Recta trayectoria, int cantPiedras, Punto piedras[], TFloat tolerancia, TFloat instante){
TFloat acum = TFloat(0.0,52);
	for(int i = 0; i<cantPiedras;i++){
		Punto valorEvaluarEnInstante = trayectoria.Evaluar(instante); 
		TFloat dist = distancia(valorEvaluarEnInstante, piedras[i]);
		acum = acum + ( (TFloat(1))/dist);
	}
	acum = acum - tolerancia;
	return acum;
}

bool biseccion( Recta trayectoria, int cantPiedras, Punto a[], TFloat tolerancia, TFloat init, TFloat fin, double tolIntervalo ){

double longIntervalo = fin.dbl() - init.dbl();

if(longIntervalo <	tolIntervalo){
	cout<<"superman  puede atravesar la ciudad"<<endl;
	return true;
}

double prox1=calcularProximidad(trayectoria,cantPiedras,a,tolerancia,init).dbl();
double prox2=calcularProximidad(trayectoria,cantPiedras,a,tolerancia,fin).dbl();


if((prox1>0) || (prox2>0)){
	cout<<"superman no puede atravesar la ciudad"<<endl;
		return false;
	}else{
		TFloat medio = init + ((fin-init)/2);
		return( biseccion(trayectoria,cantPiedras,a,tolerancia, init, medio,tolIntervalo )&& biseccion(trayectoria,cantPiedras,a,tolerancia, medio, fin,tolIntervalo )  );
			
	}

}



int main()
{
	 //pruebitas para el punto
	
	Punto p(TFloat(3.0,52),TFloat(2.0,52),TFloat(3.0,52));
	//p.set(3.2,2.1,3.2);
	Punto q(1.0,1.0,0.0);
	p.Imprimir();
	q.Imprimir();
	//p.set(3.2,2.1,3.2);
	//p.Imprimir();
	cout<< p.get_x().dbl()<<endl;
	cout<< p.get_y().dbl()<<endl;
	cout<< p.get_z().dbl()<<endl;
	Punto r= p.Sumar(q);
	r.Imprimir();
	Punto p2= q.Multiplicar(2.0);
	p2.Imprimir();
	
	// pruebas para recta
	
	Recta rect(q,p2);
	rect.Imprimir();
	Punto result = rect.Evaluar(0.5);
	result.Imprimir();

	 return 0; 
 }
  
